//要进行axios二次封装:使用请求与响应拦截器
import axios from 'axios'
import { ElMessage } from 'element-plus'
import { useUserStore } from '@/store/modules/user.ts'
// 利用:axios对象的create创建一个axios实例(进行配置)
let request = axios.create({
  //基础路径
  baseURL: import.meta.env.VITE_APP_BASE_API, // 基础路径会携带/api
  timeout: 8000, // 请求超时时间
})

//第二步:request实例添加请求与响应拦截器
request.interceptors.request.use((config) => {
  // 获取用户相关的小仓库:获取仓库内部token，登录成功以后挈带给服务器
  let useStore = useUserStore()
  if (useStore.token) {
    config.headers.token = useStore.token
  }
  // config配置对象，headers属性请求头，经常给服务器端携带公共的参数
  // 返回配置对象
  return config
})

//第三步:响应拦截器
request.interceptors.response.use(
  (response) => {
    // response响应对象，data属性就是服务器端响应回来的数据
    // 返回data数据
    return response.data
  },
  (error) => {
    //失败回调:处理http网络错误信息
    //定义一个变量:存储网络错误信息
    let message = ''
    //http状态码
    let status = error.response.status
    switch (status) {
      case 401:
        message = '登录信息过期，请重新登录'
        break
      case 403:
        message = '没有权限，请联系管理员'
        break
      case 404:
        message = '请求资源不存在'
        break
      case 500:
        message = '服务器错误，请联系管理员'
        break
      default:
        message = '网络错误'
        break
    }
    //提示错误信息
    ElMessage({
      type: 'error',
      message,
    })
    return Promise.reject(error)
  },
)

// 对外暴露request   其他模块引入request对象 import request from '@/utils/request'
export default request
